package com.sjz.videoplayer;

import java.io.File;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class VideoplayerActivity  extends Activity {
    private EditText nameText;
    private String path;
    private MediaPlayer mediaPlayer;
    private SurfaceView surfaceView;  //视频播放的控件
    private boolean pause;  //是否暂停的标识
    private int position;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaPlayer = new MediaPlayer();   //创建播放器对象
        nameText = (EditText) this.findViewById(R.id.filename);
        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
        //把输送给surfaceView的视频画面，直接显示到屏幕上,不要维持它自身的缓冲区   设置类型 
        surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceView.getHolder().setFixedSize(176, 144); //设置尺寸   分辨率
        surfaceView.getHolder().setKeepScreenOn(true);//保持屏幕常开  高亮
        surfaceView.getHolder().addCallback(new SurfaceCallback());//监听一个对象  可以监听surfaceView什么时候被创建
    }
    
    
    /****
     * surfaceView被创建时触发事件   不再使用onResume和onPause两个方法
     *
     */
    private final class SurfaceCallback implements android.view.SurfaceHolder.Callback{
    	
    	/****
    	 * surfaceView  绘图区域发生变化时触发
    	 */
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
			
		}
		
		/***
		 * surfaceView 被创建时调用    替换onResume方法
		 */
		public void surfaceCreated(SurfaceHolder holder) {
			if(position>0 && path!=null){
				play(position);
				position = 0;
			}
		}
		
		/***
		 * surfaceView被摧毁时候调用   可以把onPause注释掉了   实现的功能一样
		 */
		public void surfaceDestroyed(SurfaceHolder holder) {
			if(mediaPlayer.isPlaying()){
				position = mediaPlayer.getCurrentPosition();
				mediaPlayer.stop();
			}
		}
    }
    
    /****
     * 如果不在前台的话，会被触发    判断是否正在播放 如果正在播放的话，先得到播放位置 然后停止播放
     
    @Override
    protected void onPause() {
    	if(mediaPlayer.isPlaying()){
			position=mediaPlayer.getCurrentPosition();
			mediaPlayer.stop();
		}
    	super.onPause();
    }
    */
    /****
     * 如果返回前台的话   判断是否已经播放过，得到播放位置，并且播放路径存在 就从播放位置来进行播放  
     * 会有一个问题 surfaceView 是在onResume之后重新创建  
     * 出现的问题是 能播放声音  不会出现视频   
   
    @Override
    protected void onResume() {
    	if(position>0&&path!=null){
    		play(position);
    	}
    	super.onResume();
    }
  */
    /****
     * 在活动被销毁之前执行最后的清理  
     * 播放停止  
     */
	@Override
	protected void onDestroy() {
    	mediaPlayer.release();
    	mediaPlayer = null;
		super.onDestroy();
	}

	/***
	 * 点击按钮触发的事件
	 */
	public void mediaplay(View v){
    	switch (v.getId()) {
		case R.id.playbutton: //播放 
			String filename = nameText.getText().toString();  //得到文本输入框
			if(filename.startsWith("http")){  //判断文件是否是网络路径
				path = filename;
				play(0);
			}else{
				//从sd卡根目录下  得到文件
				File file = new File(Environment.getExternalStorageDirectory(), filename);
				if(file.exists()){
					path = file.getAbsolutePath();
					play(0);  //播放
				}else{  //如果路径不存在 提示信息
					path = null;
					Toast.makeText(this, R.string.filenoexsit, 1).show();
				}
			}
		
			break;

		case R.id.pausebutton:  //暂停   这个实现的功能是如果播放就暂停，如果暂停的话，就播放
			if(mediaPlayer.isPlaying()){//判断是否正在播放   如果在播放的话，就暂停 
				mediaPlayer.pause();//暂停方法
				pause = true; //标识暂停了
			}else{
				if(pause){//没有播放， 已经暂停的话，就开始播放
					mediaPlayer.start();
					pause = false;
				}
			}
			break;
			
		case R.id.resetbutton://重播   如果正在播放的话，就从头开始播放  如果没有播放的话，也从头开始播放
			if(mediaPlayer.isPlaying()){
				mediaPlayer.seekTo(0);
			}else{
				if(path!=null){
					play(0);
				}
			}
			break;
		case R.id.stopbutton:  //停止   如果正在播放就停止 否则不做操作
			if(mediaPlayer.isPlaying()){
				mediaPlayer.stop();
			}
			break;
		}
    }

	
	/****
	 * 视频播放
	 * @param position   播放的位置
	 */
	private void play(int position) {
		try {
			mediaPlayer.reset();   //播放器恢复到最初始的状态
			mediaPlayer.setDataSource(path);//设置播放文件   播放的视频  还需要是流媒体视频
			mediaPlayer.setDisplay(surfaceView.getHolder());//设置视频的播放画面在哪播放     设置控制对象
			mediaPlayer.prepare();//缓冲
			mediaPlayer.setOnPreparedListener(new PrepareListener(position));   //缓存后的回调方法
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/***
	 * 监听缓存视频对象缓存完成后触发
	 * @author Administrator
	 *
	 */
	private final class PrepareListener implements OnPreparedListener{
		private int position;
		
		public PrepareListener(int position) {
		     this.position = position;
		}

		public void onPrepared(MediaPlayer mp) {
			mediaPlayer.start();//播放视频
			if(position>0) mediaPlayer.seekTo(position);  //设置播放位置
		}
	}
}